package com.hyper_yang.javase.collections;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.function.Consumer;

public class Collection_traverse {
    // set 没索引 无法用 for 循环遍历
    // 通用遍历方式 迭代器（Iterator）遍历、增强 for循环、lambda
/*
    Iterator<E> iterator() 返回迭代器对象，默认指向当前集合的 0索引
        methods: boolean hasNext()  判断当前位置是否有元素
                 E next()   获取当前位置的元素，并将迭代器对象移向下一个位置
                 void remove() 从 iterator指向的 collection中移除迭代器返回的最后一个元素
*/
/*
    JDK 5 以后出现，增强 for循环，底层是迭代器实现，所有的单列集合和数组才能用增强 for进行遍历
    for ( Type var : list/collection ) {
           use(var);
    }
 */
/*
    JDK 8 以后出现，lambda表达式，提供简单直接的遍历集合方式
    default void forEach(Consumer<? super T> action) // 结合 lambda表达式遍历集合
*/

    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("a");
        collection.add("b");
        collection.add("c");
        collection.add("d");

/*  ==================================================================================================
        // Iterator
        Iterator<String> iterator = collection.iterator();
        while (iterator.hasNext()){
            String next = iterator.next(); // 输出，并将指针移向下一位置
            System.out.println(next);
        }
        // ps: iterator.hasNext == false && iterator.next() XXX error NoSuchElementException
//        iterator.next();

        //     iterator 遍历完毕指针不会复位
        Iterator<String> iterator2 = collection.iterator(); // 重新获取一个新的迭代器对象

        //     迭代器遍历时不能用集合的方法进行增加或者删除
//        产生ConcurrentModificationException 并发修改异常

        while (iterator2.hasNext()) {
            String next = iterator2.next();
            if ("b".equals(next)){
                iterator2.remove(); // a c d
//                iterator2.next(); // a d
            }else {
                System.out.println(next);
            }
        }
*/
/*  ======================================================================================
        for (String s : collection) {
            s="q"; // 修改此 for循环中的变量，不会改变集合中原本的数据
            System.out.println("="+s);
        }
        System.out.println(collection);
*/
/*  ====================================================================================== */
        // 匿名内部类
        // 底层遍历调用 accept方法
        collection.forEach(new Consumer<String>() {
            @Override
            // s 依次表示集合中的每一个数据
            public void accept(String s) {
                System.out.println(s);
            }
        });
        // lambda 简写
        collection.forEach(s -> System.out.println(s));
    }
}
